{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Global Mechanisms\n", "Global mechanisms provide a framework to have certain reactions work on specific subsets of species in a CRN, applied at the end of compilation to all species created by Component and Mixture Mechanisms.\n", "\n", "Under the hood, global mechanisms work just like normal mechanisms - they take a set of species and compile them into CRNs. Global mechanisms are called at the end of the compilation, so they apply to all species generated by all local mechanisms. \n", "\n", "### Keywords:\n", "__filter_dict__ {str : True/False} is used to make global mechanisms selective. The dictionaries keys (strings) can be species' names, types, or attributes. The mechanism is then applied or not based upon the value of that attribute in the filter_dict. For exampe filter_dict = {\"dna\":False} would not apply its mechanism to any \"dna\" species. \n", "\n", "__default_on__ True / False: For species with no attributes in the filter_dict, a global mechanism defaults to its default_on keyword, which can be True or False.\n", "\n", "__recursive_species_filtering__ True / False: When applying a filter dictionary to a ComplexSpecies, this keyword determines if the filter will be applied recursively to all species inside that complex species. For example, consider the filter dict filter_dict = {\"dna\":False}. A ComplexSpecies (material_type=\"complex\") consisting of a species of type material_type=\"dna\" and a species of type material_type=\"protein\" will not be effected by this filter unless recursive_species_filtering = True. Note that attributes are automatically inheritted recursively, so this keyword only matters for name and material_type filters.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 1: Global Dilution using attributes\n", "\n", "In the following example, a model will be set up where global mechanisms cause degredation by dilution on all species which are do not have the attributes \"genomic\" or \"machinery\"" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Species (17) = {0. protein[RNAP], 1. protein[Ribo], 2. protein[RNAase], 3. dna[G1], 4. rna[G1], 5. complex[dna[G1]:protein[RNAP]], 6. protein[G1], 7. complex[protein[Ribo]:rna[G1]], 8. dna[G2(genomic)], 9. rna[G2], 10. complex[dna[G2]:protein[RNAP]], 11. protein[G2], 12. complex[protein[Ribo]:rna[G2]], 13. complex[protein[RNAase]:rna[G1]], 14. complex[complex[protein[Ribo]:rna[G1]]:protein[RNAase]], 15. complex[protein[RNAase]:rna[G2]], 16. complex[complex[protein[Ribo]:rna[G2]]:protein[RNAase]]}\n", "\n", "Reactions (27) = [\n", "0. dna[G1]+protein[RNAP] <--> complex[dna[G1]:protein[RNAP]]\n", " Kf=k_forward * dna_G1 * protein_RNAP\n", " Kr=k_reverse * complex_dna_G1_protein_RNAP_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "1. complex[dna[G1]:protein[RNAP]] --> dna[G1]+rna[G1]+protein[RNAP]\n", " Kf=k_forward * complex_dna_G1_protein_RNAP_\n", " k_forward=3\n", "\n", "2. rna[G1]+protein[Ribo] <--> complex[protein[Ribo]:rna[G1]]\n", " Kf=k_forward * rna_G1 * protein_Ribo\n", " Kr=k_reverse * complex_protein_Ribo_rna_G1_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "3. complex[protein[Ribo]:rna[G1]] --> rna[G1]+protein[G1]+protein[Ribo]\n", " Kf=k_forward * complex_protein_Ribo_rna_G1_\n", " k_forward=2\n", "\n", "4. dna[G2(genomic)]+protein[RNAP] <--> complex[dna[G2]:protein[RNAP]]\n", " Kf=k_forward * dna_G2_genomic * protein_RNAP\n", " Kr=k_reverse * complex_dna_G2_genomic_protein_RNAP_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "5. complex[dna[G2]:protein[RNAP]] --> dna[G2(genomic)]+rna[G2]+protein[RNAP]\n", " Kf=k_forward * complex_dna_G2_genomic_protein_RNAP_\n", " k_forward=3\n", "\n", "6. rna[G2]+protein[Ribo] <--> complex[protein[Ribo]:rna[G2]]\n", " Kf=k_forward * rna_G2 * protein_Ribo\n", " Kr=k_reverse * complex_protein_Ribo_rna_G2_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "7. complex[protein[Ribo]:rna[G2]] --> rna[G2]+protein[G2]+protein[Ribo]\n", " Kf=k_forward * complex_protein_Ribo_rna_G2_\n", " k_forward=2\n", "\n", "8. protein[RNAP] --> \n", " Kf=k_forward * protein_RNAP\n", " k_forward=0.5\n", "\n", "9. protein[Ribo] --> \n", " Kf=k_forward * protein_Ribo\n", " k_forward=0.5\n", "\n", "10. protein[RNAase] --> \n", " Kf=k_forward * protein_RNAase\n", " k_forward=0.5\n", "\n", "11. dna[G1] --> \n", " Kf=k_forward * dna_G1\n", " k_forward=0.5\n", "\n", "12. rna[G1] --> \n", " Kf=k_forward * rna_G1\n", " k_forward=0.5\n", "\n", "13. complex[dna[G1]:protein[RNAP]] --> \n", " Kf=k_forward * complex_dna_G1_protein_RNAP_\n", " k_forward=0.5\n", "\n", "14. protein[G1] --> \n", " Kf=k_forward * protein_G1\n", " k_forward=0.5\n", "\n", "15. complex[protein[Ribo]:rna[G1]] --> \n", " Kf=k_forward * complex_protein_Ribo_rna_G1_\n", " k_forward=0.5\n", "\n", "16. rna[G2] --> \n", " Kf=k_forward * rna_G2\n", " k_forward=0.5\n", "\n", "17. protein[G2] --> \n", " Kf=k_forward * protein_G2\n", " k_forward=0.5\n", "\n", "18. complex[protein[Ribo]:rna[G2]] --> \n", " Kf=k_forward * complex_protein_Ribo_rna_G2_\n", " k_forward=0.5\n", "\n", "19. rna[G1]+protein[RNAase] <--> complex[protein[RNAase]:rna[G1]]\n", " Kf=k_forward * rna_G1 * protein_RNAase\n", " Kr=k_reverse * complex_protein_RNAase_rna_G1_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "20. complex[protein[RNAase]:rna[G1]] --> protein[RNAase]\n", " Kf=k_forward * complex_protein_RNAase_rna_G1_\n", " k_forward=0.5\n", "\n", "21. complex[protein[Ribo]:rna[G1]]+protein[RNAase] <--> complex[complex[protein[Ribo]:rna[G1]]:protein[RNAase]]\n", " Kf=k_forward * complex_protein_Ribo_rna_G1_ * protein_RNAase\n", " Kr=k_reverse * complex_complex_protein_Ribo_rna_G1__protein_RNAase_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "22. complex[complex[protein[Ribo]:rna[G1]]:protein[RNAase]] --> protein[Ribo]+protein[RNAase]\n", " Kf=k_forward * complex_complex_protein_Ribo_rna_G1__protein_RNAase_\n", " k_forward=0.5\n", "\n", "23. rna[G2]+protein[RNAase] <--> complex[protein[RNAase]:rna[G2]]\n", " Kf=k_forward * rna_G2 * protein_RNAase\n", " Kr=k_reverse * complex_protein_RNAase_rna_G2_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "24. complex[protein[RNAase]:rna[G2]] --> protein[RNAase]\n", " Kf=k_forward * complex_protein_RNAase_rna_G2_\n", " k_forward=0.5\n", "\n", "25. complex[protein[Ribo]:rna[G2]]+protein[RNAase] <--> complex[complex[protein[Ribo]:rna[G2]]:protein[RNAase]]\n", " Kf=k_forward * complex_protein_Ribo_rna_G2_ * protein_RNAase\n", " Kr=k_reverse * complex_complex_protein_Ribo_rna_G2__protein_RNAase_\n", " k_forward=100\n", " k_reverse=20\n", "\n", "26. complex[complex[protein[Ribo]:rna[G2]]:protein[RNAase]] --> protein[Ribo]+protein[RNAase]\n", " Kf=k_forward * complex_complex_protein_Ribo_rna_G2__protein_RNAase_\n", " k_forward=0.5\n", "\n", "]\n", "Simulating with BioSCRAPE\n", "Simulating with BioSCRAPE\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\importlib\\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject\n", " return f(*args, **kwds)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\biocrnpyler-1.0.2-py3.7.egg\\biocrnpyler\\chemical_reaction_network.py:309: UserWarning: Trying to set species that is not in model: protein_Ribo_machinery\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\biocrnpyler-1.0.2-py3.7.egg\\biocrnpyler\\chemical_reaction_network.py:309: UserWarning: Trying to set species that is not in model: protein_RNAP_machinery\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\biocrnpyler-1.0.2-py3.7.egg\\biocrnpyler\\chemical_reaction_network.py:309: UserWarning: Trying to set species that is not in model: protein_RNAase_machinery\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:94: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.\n" ] } ], "source": [ "from biocrnpyler import *\n", "\n", "#We will only use default parameters in this model, for simplicity.\n", "kb, ku, ktx, ktl, kdeg, kdil = 100, 20, 3, 2, .5, .5\n", "parameters = {\"kb\":kb, \"ku\":ku, \"ktx\":ktx, \"ktl\":ktl, \"kdeg\": kdeg, \"kdil\":kdil}\n", "\n", "#Creates a global dilution mechanism that acts on all species generated except for\n", "# those with the type or attribute \"genome\" or \"machinery\"\n", "dilution_mechanism = Dilution(filter_dict = {\"genomic\":False, \"machinery\":False}, default_on = True)\n", "\n", "#Add this mechanism to a dictionary which is passed into the Mixture txtl.TxTlExtract\n", "global_mechanisms = {\"dilution\":dilution_mechanism}\n", "myMixture = TxTlExtract(name = \"txtl\", parameters = parameters, global_mechanisms = global_mechanisms)\n", "\n", "#Add machinery attributes to species I want constiutively expressed at the dilution rate\n", "myMixture.rnap.add_attribute(\"machinery\")\n", "myMixture.rnaase.add_attribute(\"machinery\")\n", "myMixture.ribosome.add_attribute(\"machinery\")\n", "\n", "#Creates a dna assembly. This assembly is type \"dna\" so it will be degraded\n", "A_dna = DNAassembly(name = \"G1\", promoter = \"pBest\", rbs = \"BCD2\")\n", "\n", "#Create another dna assembly but set its internal specie's attributes to contain \"genomic\" so it will not be degraded\n", "#Note: this only protects the dna_G2 species encoded by this assembly as well as complex species (eg rnap:DNA) which inherit their subspecies attributes.\n", "A_genome = DNAassembly(name = \"G2\", promoter = \"pBest\", rbs = \"BCD2\", attributes = [\"genomic\"])\n", "\n", "\n", "myMixture.add_components(A_dna)\n", "myMixture.add_components(A_genome)\n", "myCRN = myMixture.compile_crn()\n", "print(myCRN.pretty_print(show_rates = True, show_materials = True, show_attributes = True, show_keys = False))\n", "\n", "\n", "\n", "print(\"Simulating with BioSCRAPE\")\n", "try:\n", " print(\"Simulating with BioSCRAPE\")\n", " import numpy as np\n", " import pylab as plt\n", " timepoints = np.arange(0, 50, .1)\n", "\n", " x0_dict = {myMixture.ribosome.get_species():100,\n", " myMixture.rnap.get_species():20,\n", " myMixture.rnaase.get_species():10,\n", " A_dna.dna:20,\n", " A_genome.dna:20}\n", "\n", " full_result_sto = myCRN.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0_dict, stochastic = True)\n", " full_result_det = myCRN.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0_dict, stochastic = False)\n", "\n", " if (full_result_det is not None) and (full_result_sto is not None):\n", " #chemical_reaction_network.get_all_species_containing is a useful shortcut to get lists of species\n", " tot_A_dna_det = np.sum(full_result_det[myCRN.get_all_species_containing(A_dna.dna, return_as_strings=True)], 1)\n", " tot_A_genome_det = np.sum(full_result_det[myCRN.get_all_species_containing(A_genome.dna, return_as_strings=True)], 1)\n", " tot_A_dna_sto = np.sum(full_result_sto[myCRN.get_all_species_containing(A_dna.dna, return_as_strings=True)], 1)\n", " tot_A_genome_sto = np.sum(full_result_sto[myCRN.get_all_species_containing(A_genome.dna, return_as_strings=True)], 1)\n", "\n", " tot_A_dna_rna_det = np.sum(full_result_det[myCRN.get_all_species_containing(A_dna.transcript, return_as_strings=True)], 1)\n", " tot_A_genome_rna_det = np.sum(full_result_det[myCRN.get_all_species_containing(A_genome.protein, return_as_strings=True)], 1)\n", " tot_A_dna__rna_sto = np.sum(full_result_sto[myCRN.get_all_species_containing(A_dna.transcript, return_as_strings=True)], 1)\n", " tot_A_genome_rna_sto = np.sum(full_result_sto[myCRN.get_all_species_containing(A_genome.protein, return_as_strings=True)], 1)\n", "\n", " plt.figure(figsize = (14, 10))\n", " plt.subplot(131)\n", " plt.plot(timepoints, tot_A_dna_det, color = \"blue\", label = \"Non-Genomic DNA (deterministic)\")\n", " plt.plot(timepoints, tot_A_genome_det, color = \"cyan\", label = \"Genomic DNA (deterministic)\")\n", " plt.plot(timepoints, tot_A_dna_sto, \":\", color = \"blue\", label = \"Non-Genomic DNA (stochastic)\")\n", " plt.plot(timepoints, tot_A_genome_sto, \":\", color = \"cyan\", label = \"Genomic DNA (stochastic)\")\n", " plt.legend()\n", " plt.xlabel(\"Time\")\n", " plt.title(\"DNA\")\n", " plt.ylabel(\"Concentration or Count\")\n", "\n", " plt.subplot(132)\n", " plt.plot(timepoints, tot_A_dna_rna_det, color = \"blue\", label = \"Non-Genomic RNA (deterministic)\")\n", " plt.plot(timepoints, tot_A_genome_rna_det, color = \"cyan\", label = \"Genomic RNA (deterministic)\")\n", " plt.plot(timepoints, tot_A_dna__rna_sto, \":\", color = \"blue\", label = \"Non-Genomic RNA (stochastic)\")\n", " plt.plot(timepoints, tot_A_genome_rna_sto, \":\", color = \"cyan\", label = \"Genomic RNA (stochastic)\")\n", " plt.legend()\n", " plt.xlabel(\"Time\")\n", " plt.title(\"RNA\")\n", " plt.ylabel(\"Concentration / Count\")\n", "\n", " plt.subplot(133)\n", " plt.plot(timepoints, full_result_det[str(A_dna.protein)], color = \"blue\", label = \"Non-Genomic Protein (deterministic)\")\n", " plt.plot(timepoints, full_result_det[str(A_genome.protein)], color = \"cyan\", label = \"Genomic Protein (deterministic)\")\n", " plt.plot(timepoints, full_result_sto[str(A_dna.protein)], \":\", color = \"blue\", label = \"Non-Genomic Protein (stochastic)\")\n", " plt.plot(timepoints, full_result_sto[str(A_genome.protein)], \":\", color = \"cyan\", label = \"Genomic Protein (stochastic)\")\n", " plt.legend()\n", " plt.title(\"Protein\")\n", " plt.xlabel(\"Time\")\n", " plt.ylabel(\"Concentration / Count\")\n", "\n", " plt.show()\n", "except ModuleNotFoundError:\n", " print('please install the plotting libraries: pip install biocrnpyler[all]')\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 2: Global Dilution using material_type with and without recursive_species_filtering\n", "\n", "In this example a very simple model of a piece of DNA $G$ binding to a protein $P$ to form a complex will be considered. Dilution will be applied to all species excent those of type \"dna\". When recursive_species_filtering is False, the protein AND the DNA-protein complex are both diluted. When recursive_species_filtering is True, only the protein is diluted." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CRN: recursive_species_filtering = False:\n", " Species = protein_A, dna_G, complex_dna_G_protein_A_\n", "Reactions = [\n", "\tprotein[A]+dna[G] <--> complex[dna[G]:protein[A]]\n", "\tprotein[A] --> \n", "\tcomplex[dna[G]:protein[A]] --> \n", "]\n", "\n", "CRN: recursive_species_filtering = True:\n", " Species (3) = {0. protein[A], 1. dna[G], 2. complex[dna[G]:protein[A]]}\n", "\n", "Reactions (2) = [\n", "0. protein[A]+dna[G] <--> complex[dna[G]:protein[A]]\n", " Kf=k_forward * protein_A * dna_G\n", " Kr=k_reverse * complex_dna_G_protein_A_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=one_step_binding, partid=dna_G_protein_A, name=kb).\n", " k_reverse=20\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=one_step_binding, partid=dna_G_protein_A, name=ku).\n", "\n", "1. protein[A] --> \n", " Kf=k_forward * protein_A\n", " k_forward=0.5\n", " found_key=(mech=None, partid=None, name=kdil).\n", " search_key=(mech=global_degredation_via_dilution, partid=protein_A, name=kdil).\n", "\n", "]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", " and should_run_async(code)\n" ] } ], "source": [ "G = Species(\"G\", material_type = \"dna\")\n", "A = Species(\"A\", material_type = \"protein\")\n", "C1 = ChemicalComplex([G, A])\n", "\n", "dilution_mechanism_no_recursion = Dilution(filter_dict = {\"dna\":False}, default_on = True, recursive_species_filtering = False)\n", "M_no_recursion = ExpressionExtract(components = [C1], global_mechanisms = {\"dilution\":dilution_mechanism_no_recursion}, parameters = parameters)\n", "CRN_no_recursion = M_no_recursion.compile_crn()\n", "print(\"CRN: recursive_species_filtering = False:\\n\", CRN_no_recursion)\n", "\n", "dilution_mechanism_recursion = Dilution(filter_dict = {\"dna\":False}, default_on = True, recursive_species_filtering = True)\n", "M_recursion = ExpressionExtract(components = [C1], global_mechanisms = {\"dilution\":dilution_mechanism_recursion}, parameters = parameters)\n", "CRN_recursion = M_recursion.compile_crn()\n", "print(\"\\nCRN: recursive_species_filtering = True:\\n\", CRN_recursion.pretty_print(show_keys = True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example 3: Global Degredation of Linear DNA Strands by RecBCD inhibited by GamS\n", "\n", "In this example, the degredation of linear DNA strands in an extract is modeled along with the possibility of inhibiting this degredation with GamS, as described by [Sun et al. 2014.](https://pubs.acs.org/doi/abs/10.1021/sb400131a)\n", "\n", "This model will use a global degredation mechanism that applies to all DNA without the attribute 'circular'. This example will create a warning because some Species will have both material_type = 'dna' and 'circular' in which case the default_on = False keyword will be used to turn off degredation." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel\\ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n", " and should_run_async(code)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\biocrnpyler-1.0.2-py3.7.egg\\biocrnpyler\\global_mechanism.py:104: UserWarning: species dna_RFP_circular has multiple attributes(or material type) which conflict with global mechanism filter deg_tagged_degredation. Using default value False.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Species (10) = {0. GamS, 1. recBCD, 2. complex[2x_GamS:recBCD], 3. dna[GFP], 4. rna[GFP], 5. protein[GFP], 6. dna[RFP(circular)], 7. rna[RFP], 8. protein[RFP], 9. complex[dna[GFP]:recBCD]}\n", "\n", "Reactions (9) = [\n", "0. 2GamS+recBCD <--> complex[2x_GamS:recBCD]\n", " Kf=k_forward * GamS^2 * recBCD\n", " Kr=k_reverse * complex_GamS_2x_recBCD_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=one_step_binding, partid=GamS_2x_recBCD, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=one_step_binding, partid=GamS_2x_recBCD, name=ku).\n", "\n", "1. dna[GFP] --> dna[GFP]+rna[GFP]\n", " Kf=k_forward * dna_GFP\n", " k_forward=0.5\n", " found_key=(mech=None, partid=None, name=ktx).\n", " search_key=(mech=simple_transcription, partid=strong, name=ktx).\n", "\n", "2. rna[GFP] --> rna[GFP]+protein[GFP]\n", " Kf=k_forward * rna_GFP\n", " k_forward=1.5\n", " found_key=(mech=None, partid=None, name=ktl).\n", " search_key=(mech=simple_translation, partid=weak, name=ktl).\n", "\n", "3. dna[RFP(circular)] --> dna[RFP(circular)]+rna[RFP]\n", " Kf=k_forward * dna_RFP_circular\n", " k_forward=0.5\n", " found_key=(mech=None, partid=None, name=ktx).\n", " search_key=(mech=simple_transcription, partid=strong, name=ktx).\n", "\n", "4. rna[RFP] --> rna[RFP]+protein[RFP]\n", " Kf=k_forward * rna_RFP\n", " k_forward=1.5\n", " found_key=(mech=None, partid=None, name=ktl).\n", " search_key=(mech=simple_translation, partid=weak, name=ktl).\n", "\n", "5. dna[GFP]+recBCD <--> complex[dna[GFP]:recBCD]\n", " Kf=k_forward * dna_GFP * recBCD\n", " Kr=k_reverse * complex_dna_GFP_recBCD_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=deg_tagged_degredation, partid=dna_GFP, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=deg_tagged_degredation, partid=dna_GFP, name=ku).\n", "\n", "6. complex[dna[GFP]:recBCD] --> recBCD\n", " Kf=k_forward * complex_dna_GFP_recBCD_\n", " k_forward=0.5\n", " found_key=(mech=None, partid=None, name=kdeg).\n", " search_key=(mech=deg_tagged_degredation, partid=dna_GFP, name=kdeg).\n", "\n", "7. rna[GFP] --> \n", " Kf=k_forward * rna_GFP\n", " k_forward=0.05\n", " found_key=(mech=None, partid=None, name=kdil).\n", " search_key=(mech=rna_degredation, partid=rna_GFP, name=kdil).\n", "\n", "8. rna[RFP] --> \n", " Kf=k_forward * rna_RFP\n", " k_forward=0.05\n", " found_key=(mech=None, partid=None, name=kdil).\n", " search_key=(mech=rna_degredation, partid=rna_RFP, name=kdil).\n", "\n", "]\n", "Simulating with BioSCRAPE\n" ] }, { "data": { "image/png": "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3r0ZMGBA+H5QVOHnx6F0Zeh8YkPDhkpuW15bXudrx2qY/T60vh5O8n2M+kILgIh8BXQBqolIMvA0TsuIeGCCe4X8D1W9Q1WXiMjXwFKcw+e7VTXTXdWdOC2KSuOcVx1PmFqyZAlnnnnmceeZMWMGrVq1AuCqq67i8ccfP+r1WbNmERMTQ95TAb/99luh685WrVo15s6dyzvvvMOQIUP48MMPGTx4MOeffz4ff/wxe/bsoW3btnTr1o3q1aszYcIESpUqxapVq+jXr19OZ2SzZ89m8eLFOe2cmzdvzp9//lmkGELS8rGwfgZcNARKVypwtn79+gE0AcRy2/I6LEx4EkqUhvOf8MvqCi0Aqtovn8kfHWf+wcDgfKYnAb6XrDyOt0cTLHfffTe//vorcXFxOQlW0KHyv//9bz7//HPKly/PiBEjjmlitmXLlmM+PAW54oorAGjTpg3ffeeMgf3LL78wevTonPOrqampbNy4kZNPPpl77rmH+fPnExsby8qVK3PW07Zt26NucomNjSUuLo79+/dTvnz5E3gnQkBGmvMhqdYY2tx03Fm/+uorhg8fvlBVE3NNDonctry2vD7G2mmwYhx0fRrKVS98/iIIyzuBvXb66afz7bff5jx/++232bFjB4mJicdZypF9rrQgpUuXZu/evUWKIz4+HnASO/vilqry7bff0rhx46PmHTRoEDVq1GDBggVkZWVRqlSpnNfKli17zLqPHDly1DxhY/b7sGstXDcSYi29T4TldQjLyoSfB0KlU6DdXX5brXUGVwznn38+qampvPvuuznTDh06dJwliq5p06asXr262Mt3796dN998k+xrl/PmzQNg79691KxZk5iYGD777DMyMzMLXMfOnTtJSEgIv75PDu50LpA17AqNLvA6mrBjeR3C5n0O2xZDt2egpP8KmBWAYhARRo0axbRp06hfvz5t27alf//+vPzyyz6vu3PnzsybN4+/G5+cmCeffJL09HRatGhB8+bNefLJJwG46667GDZsGO3atWPlypX57h1lmzJlChdddFGxtu+pqS9C2gHofsxZGlMEltch6sh+mPw81GkHp1/u33Wrakj/tGnTRvNaunTpMdMiyX333acTJkzwbPuXX365Ll++/ISX8/T/sm2Z6qDKqj8+cEKLAUlqeR0U4ZrXqh7/byYMUn26gmpyUpEXKWpe2xFACBo4cKDfDr1PVFpaGr179z7mXGvI++UJiCsH5w30OhJTAMvrYti9AWa+DS2ugVpt/L56KwAhqEaNGlx22WWebDsuLo4bbrjBk20X2+qJsHoCdH4Yyh7bztyEBsvrYpg4CCTGafkTAFYATHjLzHBu+qpcH87+P6+jMcZ/Ns6CJd9Bx/ugYoFdp/nE2smZ8DZ3KKQsh6s/gxLxXkdjjH9kZcHPA6B8Tej4z4BtxgqACV+H98CUF6DuOdD0Uq+jMcZ/Fo+ETXOg97sQV3DLJl/ZKSATvmYMgUO7nGafETxoh4kyaYecc/81W0GLvgHdlBWAYoqNjc3p/vbSSy9lz549AKxfv57SpUvndJnbqlUr0tLSGDp0KAkJCbRq1YpmzZrxwQcf5LveefPmceuttx532xdddFHO9nwxdepULrnkkhNaJiUlhR49fOuC1i92rYU//getroWTW3kdTcSwvA4BM9+CfZugx4sQE9ivaCsAxVS6dGnmz5/P4sWLqVKlCm+//XbOaw0bNmT+/Pk5P3FxcQBcc801zJ8/n6lTpzJw4EC2bdt2zHpfeOGFQntfHDduHJUqVTpqmqqSlZXl+x92HBkZGSQkJFCzZk1+++23gG6rUBOehtg4OP9Jb+OIMJbXHuf1vi3w67+h6WVQt0PANxf+1wDGPwZbF/l3nSedAT1fKvLs7du3Z+HChUWev3r16jRs2JANGzZQo0aNnOn79+9n4cKFtGzZEoADBw5w7733kpSUhIjw9NNPc+WVV1KvXj2SkpI4cOAAPXv25LzzzmPmzJmMGjWKESNG8NlnnxETE0PPnj156aWX6NKlC0OGDCExMTGnb5f169cfFdPs2bO5//77OXz4MKVLl+aTTz6hcePGDB06lLFjx5KamsrBgweZPHkyvXv35osvvqBjx45F/pv9av1vsGw0nPc4VKjpTQyBZnkdfXkNziBGWRnFGsSoOMK/AHgsMzOTSZMmccstt+RMW7NmTU6XuR07djxqLwpg7dq1rF27llNPPfWo6UlJSTRv/nenks899xwVK1Zk0SLni2D37t3HbH/FihV88sknvPPOO4wfP55Ro0Yxa9YsypQpw65du46ZvyBNmjRh+vTplChRgokTJzJw4MCcjsFmzpzJwoULqVKlCgCJiYk88YR/uqM9YVlZTqdYFWpB+3u8iSEKWF57YPN8mP8ldLgXqtQvdHZ/CP8CcAJ7NP50+PBhWrVqxfr162nTpg0XXPB352PZh8p5jRgxgl9//ZX4+Hjee++9nMTLlrfL3IkTJzJ8+N/j2VauXPmYddatW5d27drlzH/TTTdRpkwZgGPWfzx79+6lf//+rFq1ChEhPT0957ULLrjgqHVVr16dzZs9GvRq4XDYMh+u+ADiyngTQzBYXkdXXqs6OzZlqjo3NAaJXQMopuxzpRs2bCAtLe2YvaH8ZJ8rnTVrFpdffmynTqVLlyY1NTXnuaoe0696Xrk7vypo/hIlSuScR829/tyefPJJzjvvPBYvXsyPP/541Hx5O9hKTU2ldOnSx40rINIOwqRnnVvim/cJ/vajgOW1B3kNsOxH2PCb05VJqYpB26wVAB9VrFiRN954gyFDhhy1d1EcebvMvfDCC3nrrbdynud3qJzbhRdeyMcff5zT30r2oXK9evWYM2cOACNHjsx32b1791KrlnO34dChQ4+7nZUrVx51SB80v/0X9m+B7oFvHRHtLK+DKOOIM4hRQlM4s39QN22fIj9o3bo1LVu2POqwtjiaNGnC3r172b9/PwBPPPEEu3fvpnnz5rRs2ZIpU6Ycd/kePXpw2WWXkZiYSKtWrXJGT3r44Yd599136dChAzt27Mh32UceeYQBAwbQsWPH4/apDk63uhdffHEx/kIf7N0Ev70Bp18Bp5wd3G1HKcvrIJn1Huxe79zPEuxBjIrSZaiXP9HWbe7rr7+uH3zwgddhHFenTp10165dx0wP6P/l29tUn01Q3bXer6vFuoMOinDOa9UA/m8OpKi+UFv18z5+XW1R89qOAELMnXfemTMkXihKSUnhwQcfzPfCXcAkz4GFI6D9XVC5bvC2a/zG8roAU15wrm1d+Hxwt+sK2wLgFLnIU6pUKa6//nqvwyhQQkICvXv3PmZ6wP4f2a0jyibAOQ8GZhshxPLaGwXlNQTwf7J9Gcz5BBJvhgRvxikIywJQqlQpdu7cGbEflnCjquzcuTMwg20v+R7++gPOfwJKVfD/+kOI5XXoCWhu//w4xJWHLgP8v+4iCsv7AGrXrk1ycjIpKSleh2JcpUqVonbt2v5daXoqTHwaajSH1qG79+gvltehKSC5vWoCrJkEFw6GslX9u+4TEJYFoGTJktSvH5w75YyH/ngH9myEG36AmFivowk4y+sokZnu7P1XaQBtb/c0lEJPAYnIxyKyXUQW55pWRUQmiMgq93flXK8NEJHVIrJCRLrnmt5GRBa5r70hhd0JYqLbge0w43U4rSc06BKQTdx8880ALS23TVDNGQo7VsAFz0GJOE9DKco1gKFA3n5SHwMmqWojYJL7HBFpBvQFTneXeUdEsnfd3gVuBxq5PyHS96oJSZOfh4zDAW0dceONNwKsyjPZctsEzuHdTsufep2giQf3HORRaAFQ1elA3t6XegHD3MfDgN65pg9X1SOqug5YDbQVkZpABVWd6bZR/TTXMsYcbetimPcZnHUbVDu18PmLqXPnzgAZeSZbbpvAmT7EKQLdXwiJQYyK2wqohqpuAXB/V3en1wL+yjVfsjutlvs47/R8icjtIpIkIkl2QSzKZDf7jK8A5z7iRQQBy23L6yi3c41z12/r66BmC6+jAfzfDDS/kqbHmZ4vVX1fVRNVNTF3L4ImCqz8CdZNc5rGlSl6r49B4HNuW15HuQlPhdwgRsUtANvcQ1/c39vd6clAnVzz1QY2u9Nr5zPdmL9lpDmtI6o2grNuKXz+wLDcNv63bjosHwOdHoDyJ3kdTY7iFoDRQHa3df2BH3JN7ysi8SJSH+eC2Gz3UHq/iLRzW0jckGsZYxx/fgC71jjnR2NLehWF5bbxr6xM+GkAVDwl5AYxKvQ+ABH5CugCVBORZOBp4CXgaxG5BdgIXAWgqktE5GtgKc7FtbtVNbsLvjtxWhSVBsa7P8Y4Du6AqS/Dqd3gtAuDssl+/foBNAHEctsEzNxPYdtiuGoolPRovIECSKjfdp6YmKhJSUleh2ECbcyDTvvoO3+H6k2CtlkRmaOqiUHboMvyOkqk7oU3zoRqjeCm8UFr+VPUvA7LO4FNhNm21OkU66xbg/rlb0zATR8Ch3ZCj5Eh0ewzr7DsDM5EEFX4eYDT7NPDTrGM8buda+CPd6HVdXBya6+jyZcVAOOtlT/B2qmh2OzTGN9MeApKxEPX0Gn2mZcVAOOd7Gaf1U7zstmnMf63dprb7PPBkGr2mZddAzDemf2+0+zzupFeNvs0xr+yMp272SueAu3u9jqa47ICYLxxcAdMe8Vp9tnoAq+jMcZ/jmr2GYCBZPzITgEZb0wZDGkHnJu+jIkUqXudnmxP6QDNensdTaGsAJjg27bEafN/1q2ejYVqTEBMf9Vt9vliSDb7zMsKgAkuVee2+PgK0OUxr6Mxxn92roE//uf09nlyK6+jKRIrACa4Vox3evs8b6A1+zSR5ZcnnWafIdTbZ2GsAJjgyUiDXx6Hao0h8WavozHGf9ZOhRVjQ77ZZ17WCsgEz+z3YddauO5ba/ZpIkdWJvw0ECqFfrPPvKwAmODIafZ5ATTq5nU0xvjP3GGwfQlcNSzkm33mZaeATHBYs08TibKbfdbtCM16eR3NCbMCYAJv62Kn2Wfb2yDhNK+jMcZ/pr0Ch3aFzCDvJ8oKgAms7EHeS1WEcx/1Ohpj/Cf3IO9h0uwzLysAJrCym312sWafJsLkNPt8yutIis0KgAmcjCO5mn3e5HU0xvhPTrPPh6B8Da+jKTZrBWQCJ7vZ5z+s2aeJIJkZzt3slepCu7u8jsYnVgBMYGQ3+2x0odPjpzGRYt6nsH0pXP1p2DX7zMtOAZnAmPw8pB+CCwd7HYkx/nN4z9/NPpte5nU0PrMCYPxv62Ln5pizrNmniTDTX3WafYZJb5+FsQJg/Ct7kPdSFeHcR7yOxhj/yWn2+Q+o2dLraPzCCoDxrxXjYN10OO9xa/ZpIssvT0CJUtA1fJt95uVTARCRB0RkiYgsFpGvRKSUiFQRkQkissr9XTnX/ANEZLWIrBCR7r6Hb0JKxhFnkPeEJtAmvJt9Wm6bo6yZ4uzcdH4IylX3Ohq/KXYBEJFawH1Aoqo2B2KBvsBjwCRVbQRMcp8jIs3c108HegDviEisb+GbkDLrPdi9DroPhtjwbWBmuW2Okpnh3M1eqS6cfafX0fiVr6eASgClRaQEUAbYDPQChrmvDwN6u497AcNV9YiqrgNWA2193L4JFQdSnAtkjbpHSrNPy23jmDvMafZ54fNh3+wzr2IXAFXdBAwBNgJbgL2q+gtQQ1W3uPNsAbKPl2oBf+VaRbI77RgicruIJIlIUkpKSnFDNME0+Tm32efzXkfis0DltuV1GDq82+nJtu450PRSr6PxO19OAVXG2fOpD5wMlBWRfxxvkXymaX4zqur7qpqoqokJCQnFDdEEy5YFMPdTaPt/EdHsM1C5bXkdhqa+7BSBni9FRLPPvHw5BdQNWKeqKaqaDnwHdAC2iUhNAPf3dnf+ZKBOruVr4xxWm3CmCuMfhTJVI6nZp+W2ge3Lne5M2twIJ53hdTQB4UsB2Ai0E5EyIiJAV2AZMBro787TH/jBfTwa6Csi8SJSH2gEzPZh+yYULPkONs6Erk9C6UpeR+MvltvRThV+egziy8F5T3gdTcAUu6mGqs4SkZHAXCADmAe8D5QDvhaRW3A+SFe58y8Rka+Bpe78d6tqpo/xGy+lHYJfnoKTWkDr672Oxm8stw0rxsPaKdDjZShb1etoAkZU8z0NHzISExM1KSnJ6zBMfqa8ANNehpvGQ90OXkdTLCIyR1UTg71dy+sQlnEE3j7b6ev/jl/DsifbouZ1+DbWNt7asxF++y80vzJsv/yNydcf7zj3s1z/fVh++Z8I6wrCFM8vTwICFzzrdSTG+M/+rTB9CDS+GBqe73U0AWcFwJy49b/C0lFwzgNQsbbX0RjjPxOfgcw06B7+97MUhRUAc2KyMmH8Y1CxDnS8z+tojPGf5CRY8CW0vxuqNPA6mqCwawDmxMwZCtsWwVVDoWRpr6Mxxj+ysmD8I1DuJGec3yhhBcAU3eHd7mhI50Cz3l5HY4z/LBwBm+ZA7/9BfHmvowkaOwVkim7qS5C6J2JvizdR6sh+mPg01EqEFtd4HU1Q2RGAKZrty2D2BxF9W7yJUtOHwIFt0PdLiImufeLo+mtN8ajCTwMi/rZ4E4V2rnHa/be8FmoH/X5Az1kBMIVbMc65Lb7LwIi+Ld5EoV+egNg46Pa015F4wgqAOb6MI85oSAlN4KxbvI7GGP9ZPckd5vFhKH+S19F4wq4BmOOb+TbsXh8Vt8WbKJKZ7pzWrFwf2t3ldTSesQJgCrZvS1TdFm+iyJ8fwo4V0Pcrp9O3KGWngEzBJj0DWelRc1u8iRIHd8CUF52dmsY9vY7GU1YATP6Sk2DBV1F1W7yJEpOfh7QD0P3FqL+fxQqAOVZWFoz7V9TdFm+iwJaFTncmbW+H6k28jsZzdg3AHGvhcNg8N+puizcRLnuYx9KVocujXkcTEqwAmKOl7oOJg6LytngT4ZZ8Dxt+g0v+7RQBYwXA5DH9Ffe2+K+i7rZ4E8HSDjo3fZ10BpzZ3+toQoYVAPO3lBXwx7vOAO+123gdjTH+M+M12LcJ+nwMMbFeRxMybBfPOFSd/tDjykK3QV5HY4z/7FwDv78JLfrCKe28jiakWAEwjmU/wtqpcN7jULaa19EY4z8/DYDYeLjgGa8jCTlWAAykHXL6+6l+OiRafz8mgqz4CVb97LT6idL+fo7HrgEY+O0/sPcvuHEsxFpKmAiRnuo0+6x2GrT9P6+jCUk+HQGISCURGSkiy0VkmYi0F5EqIjJBRFa5vyvnmn+AiKwWkRUi0t338I3Pdq2DX/8DzftAvXO8jiZkWG5HgJlvwu510PNlKBHndTQhyddTQP8FflLVJkBLYBnwGDBJVRsBk9zniEgzoC9wOtADeEdE7HK8135+HGJKwIXPeR1JqLHcDmd7/oLpr0HTS60jw+ModgEQkQpAZ+AjAFVNU9U9QC9gmDvbMKC3+7gXMFxVj6jqOmA10La42zd+sGoirBgL5/4LKpzsdTQhw3I7AvzyBKDQ/QWvIwlpvhwBNABSgE9EZJ6IfCgiZYEaqroFwP1d3Z2/FvBXruWT3WnHEJHbRSRJRJJSUlJ8CNEUKOOI0+yzSsOo7g+9AAHJbcvrIFk7DZaOgnMehEqneB1NSPOlAJQAzgTeVdXWwEHcQ+IC5NftnuY3o6q+r6qJqpqYkJDgQ4imQH+8A7vWQM9Xoro/9AIEJLctr4MgM93ZsalUFzre53U0Ic+XApAMJKvqLPf5SJwPzTYRqQng/t6ea/46uZavDWz2YfumuPZthmmvQuOLoFE3r6MJRZbb4Wr2B5CyHHq8CCVLex1NyCt2AVDVrcBfItLYndQVWAqMBrI72+gP/OA+Hg30FZF4EakPNAJmF3f7xge/PAlZGXZ+tACW22HqwHaY+iKc2s3ZuTGF8rXR973AFyISB6wFbsIpKl+LyC3ARuAqAFVdIiJf43yQMoC7VTXTx+2bE7X+N1g8Ejo/AlXqex1NKLPcDjcTB0H6YejxctQP9FJUPhUAVZ0PJObzUtcC5h8MDPZlm8YHmRnOQC8V68A5D3gdTUiz3A4zf82G+V9Ax/uh2qleRxM27LbPaJL0EWxfAld/CnFlvI7GGP/IyoRxD0P5mtD5X15HE1asAESLAykwZTA06AJNL/M6GmP8Z+6nsGUBXPkRxJfzOpqwYp3BRYtJzziDYvR8xc6PmshxaBdMehbqdoTmV3odTdixAhAN/voT5n0OZ98BCY0Ln9+YcDH5OUjdYzs2xWQFINJlZcLYB52ucLsc714mY8LMpjmQ9ImzY3NSc6+jCUt2DSDS/fkRbF0IfT6B+PJeR2OMf2RlwpgHoVwN6DLA62jClhWASLZ/G0x+3rnwe/rlXkdjjP/M+QS2zHcu/Jaq4HU0YctOAUWyCU9CxmG46DU7P2oix4EU58JvvU524ddHVgAi1fpfYeEI6HCf3RhjIsuEp5xhTC+2HRtfWQGIRJnpMPYhqHgKdHrI62iM8Z8NM2HBl9DhHmvR5gd2DSAS/fGO0yNiv+F2x6+JHJkZ7o5NHbvj10/sCCDS7N0EU1+G03pC455eR2OM/8x+z+nKpMdLEFfW62g8oaqsTTnA0N/WcfPQP1m8aa9P67MjgEjz8wDQLOj5kteRGOM/+zbDlBeg0YXQ5GKvowmqg0cymLFqB9NWpjB9ZQqb9hwGoF7VMuw4cMSndVsBiCSrJ8LSH+D8J6ByPa+jMcZ/fn7cubbVMzq6et6y9zCTlm1n4rJt/L56J2mZWZSLL0H7hlW5o0tDzm2UwClVfT+9awUgUqSnOl09Vz3VafljTKRYMwWWfOfc8FWlgdfRBISqsmzLfiYs3cbEZdtY5J7aqVu1DNe3r0vXptU5q14VSsb696y9FYBI8fsbsGstXP+9jfFrIkfGEaer58r1nb7+I8yKrfsZs3AzYxZuYd2Og4hA6zqVeKRHYy5oWoNTq5dDAnjEYwUgEuxaBzNec+72bXi+19EY4z+/vwk7V8N130LJUl5H4xdrUg4wZsEWxizczKrtB4gRaNegKrd1asAFzWqQUD54O3BWAMKdKox/FGJK2Bi/JrLs2QjTh0DTS6FRN6+j8cmug2mMnr+JkXOTWbxpHyJwVr0qPNvrdHo2rxnUL/3crACEu+VjYNXPcOHzUOFkr6Mxxj9UnWtaIk6zzzCUkZnFtJUpjJyTzMRl20jPVJrXqsCTlzTj4jNqclJF749orACEs9R9MO4RqHEGnH2n19EY4z/LfoSVP8GFg6Fiba+jOSHrdhzkq9kb+W7uJnYcOELVsnHc0L4efdrUpmnN0Oq4zgpAOJsyGPZvgWs+h1j7V5oIkboPxj8CJ53h9PUfBjIys5i8fDuf/bGBGat2UCJGOL9Jda5KrEOXxgl+b73jL/atEa42zYFZ78FZt0LtNl5HY4z/TH4e9m+Fvl+E/I7N9v2pfP3nX3w5ayOb96ZSs2IpHrzgNPqeVYfqFbw/xVOY0H53Tf4yM+DH+53BMLo+6XU0xvjPpjkw+31oezvUCt0dm2Vb9vHBjLX8uGAz6ZlKp0bVePqy0+napDolQnRvPz9WAMLR7PecUb6uGgalKnodjTH+kZkBP/7TGb70/Ce8juYYqsqMVTv4YMZaZqzaQZm4WK47uy43tK9Lg4RyXodXLD4XABGJBZKATap6iYhUAUYA9YD1wNWqutuddwBwC5AJ3KeqP/u6/aiz5y+YPBgadYdmvbyOJqJZbgfZrP/B1kVw9achNcpXemYWo+dv5oMZa1m+dT8J5eN5pEdjrmtbl4plSnodnk/8cQTwT2AZkP0fewyYpKovichj7vNHRaQZ0Bc4HTgZmCgip6lqph9iiB7jHwEULno1KvpE8ZjldrDs2eg0ajitBzS9zOtoAEjLyGLknGTenrKaTXsO06h6OV7p04JerU4mvkSs1+H5hU8nq0SkNnAx8GGuyb2AYe7jYUDvXNOHq+oRVV0HrAba+rL9qLNsDKwY5/SJUrmu19FENMvtIMpu8w8hsWNzJCOTz/7YQJdXpzDw+0VUKx/PR/0T+eWBzlydWCdivvzB9yOA/wCPAOVzTauhqlsAVHWLiFR3p9cC/sg1X7I77RgicjtwO8App5ziY4gR4sh+50NS4wxoZ23+g+A/+Dm3La8LkNPm/3mo5N37ciQjkxF//sW7U9ewZW8qZ55SiRevbEHnRtUC2h+Pl4pdAETkEmC7qs4RkS5FWSSfaZrfjKr6PvA+QGJiYr7zRJ3J2W3+P4PY8D7vGOoClduW1/nIbvPv4c2MmVnKqHmbeH3CSjbtOcxZ9Srzap+WdDy1asR+8Wfz5QigI3CZiFwElAIqiMjnwDYRqenuIdUEtrvzJwN1ci1fG9jsw/ajx6a5Tsufs26B2oleRxMNLLeDJbvN/zXBb/Ovqkxevp1XflrBim37OaNWRV668gzOOTVy9/jzKvY1AFUdoKq1VbUezgWwyar6D2A00N+drT/wg/t4NNBXROJFpD7QCJhd7MijRXbTuLIJ0PUpr6OJCpbbQZKc3eb/tqDfzDhnwy6ufm8mtwxL4khGJm9d25of7u5Ip0YJUfPlD4G5D+Al4GsRuQXYCFwFoKpLRORrYCmQAdxtrSSKYOZb1uY/dFhu+0tGGoy+B8rXhPODdzPjpj2HeWHcMsYu3EK1cvE817s5fc+qE7JdNQSaXwqAqk4FprqPdwJdC5hvMDDYH9uMCjtWw9QXocklcHpvr6OJSpbbAfLrv2H7Uug3Iiht/g+nZfLe9DX8b9oaVOG+80/l/85tSNn46L4XNrr/+lCWlQU/3gex8XDxa15HY4z/bF8G01+F5n2gcY+AbkpVGbtoCy+OW86mPYe5uEVNBvRsQu3Kvo+nGwmsAISqOZ/Aht/gsrecW+ONiQRZmfDDPRBf3hngPYBWbdvPE6MWM2vdLprWrMBrV7ekXYOqAd1muLECEIr2boIJT0P9c6H1P7yOxhj/mf0+bEqCKz6AstUCsonU9Ezemrya96avoWx8CQZf3py+Z51CbEz0XNwtKisAoUYVxjwAWRlw6X89vyvSGL/ZvR4mPQuNLoQzrgrIJmasSuGJUYvZsPMQV5xZi8cvakrVct4MtxgOrACEmsXfukM8DoYq9b2Oxhj/UHWaM0sMXPy633dsUvYfYfDYpYyav5n61cry5a1n0+HUwBxhRBIrAKHk4E7nrshabay7BxNZ5n8Ja6fCRUOgUp1CZy8qVWX0gs08PXoJB49kcF/XRtzVpSGlSkZOfz2BZAUglPz0mHNr/GVvQYwlsIkQ+7fBzwPglPaQeIvfVpuy/whPjFrEz0u20fqUSrzapwWnVi9f+IImhxWAULHyZ1j0NZz7KNRo5nU0xvjPuIchPRUuexNifL/hSlUZs3ALT/2wmINpmQzo2YRbOzWwi7zFYAUgFBze4wzxmNAEOj3kdTTG+M/i72DZaKcbk2qNfF7djgNHeHLUYsYv3krLOpV47Srb6/eFFYBQ8NMAOLDNGQS7hLVYMBHiwHYY+xCcfCZ0+KfPq5uyfDv/GrmAfYczeLRHE27rVD+sxt8NRVYAvLZ8HCz4Ejr/C2qd6XU0xvhHdnPmtIPQ+12fevpMTc/kpfHLGfr7epqcVJ4vb2vHaTVsr98frAB46dAuGHM/1GgOnR/xOhpj/GfRN7B8DFzwLFRvUuzVLN+6j39+NZ8V2/Zzc8f6PNKjsbXw8SMrAF4a/wgc2gnXjYQScV5HY4x/7NvijF5Xuy20v6dYq1BVhv6+nhfHL6dCqZIMveksujSuXviC5oRYAfDK0tHOXlKXgVCzhdfRGOMf2Td8ZRxxTv0Uoznz7oNpPPTNAiYv3875TarzSp8WVLO7eQPCCoAXDu5wzo/WbAmdHvQ6GmP8Z/6Xzp3sPV6Caqee8OJzN+7mni/msuNAGs9cdjo3tK8bVQO0BJsVgGBThbEPwpF90PtHG9/XRI69yc7NjHU7Qtv/O6FFVZVPflvPC+OWcVLFUoy8sz0talcKTJwmhxWAYFv8LSz9Abo+bTd8mcihCqPvdbp77vX2Cd3wtS81nUdHLmT84q1c0KwGQ/q0pGIZ2zEKBisAwbR3k7P3XysROtzndTTG+M/sD2DNZKevnxPoxHDJ5r3c/cVc/tp9mMcvasqtnerbKZ8gsgIQLFlZMOoOZ5D3K973qV20MSFl+3KY8KTTzfNZtxZ5sZFzkhn4/SKqlIljxO3tSKxXJYBBmvzYt1Cw/PE2rJvu9IdStaHX0RjjHxlH4LtbIa6cc+qnCHvv6ZlZDB67jKG/r6dDw6q82a+19dnvESsAwbB1kTMQRpNLoPX1XkdjjP9Mft7J737DoVzh7fR3HjjCXV/MZda6Xdx6Tn0e69nEunPwkBWAQEs/DN/eCqWrwKVv2AhfJnKsmw6/vwltboLGPQudffGmvfzfZ3PYceAI/76mJZe3rh2EIM3xWAEItImDIGU5/OM7KGsDUpsIcXg3fH+Hczqz++BCZx81bxOPfruQqmXjGHlHB86oXTEIQZrCWAEIpNUTYdb/4Ow74dSuXkdjjH+owpgHnR5sb5kAcWULnDUjM4uXxi/nw1/X0bZ+Fd657ky7qzeEFPvkm4jUEZEpIrJMRJaIyD/d6VVEZIKIrHJ/V861zAARWS0iK0Skuz/+gJB1YDt8fyckNIVuT3sdjTkBltuFWPAVLPkOujx23B5s96Wmc9PQP/nw13X0b1+XL2492778Q4wvV18ygIdUtSnQDrhbRJoBjwGTVLURMMl9jvtaX+B0oAfwjohEZrd+WVnw3W3O3b59PoKSpb2OyJwYy+2CbF/u9PFfrxOcU3A3Jht3HuLKd35n5pqdvHTFGTzTqzkl7WJvyCn2f0RVt6jqXPfxfmAZUAvoBQxzZxsG9HYf9wKGq+oRVV0HrAbaFnf7Ie3X15wBsHu+AjVO9zoac4IstwuQdghG3gQly8AVHxTY0VvS+l30fuc3tu8/wqe3tKVv21OCHKgpKr+UZBGpB7QGZgE1VHULOB8kILttWC3gr1yLJbvT8lvf7SKSJCJJKSkp/ggxeDb8DlNegOZ94MwbvI7G+MifuR3WeQ3w06OwfSlc8R5UqJnvLN/PS+baD2ZRsXRJvr+rAx0aVgtykOZE+FwARKQc8C1wv6ruO96s+UzT/GZU1fdVNVFVExMSEnwNMXgO7oSRt0DlenDJv63JZ5jzd26HbV4DLPwG5n7qnPY5tdsxL2dlKa/9soIHRizgzLqV+P6uDjRIKOdBoOZE+NQKSERK4nxAvlDV79zJ20SkpqpuEZGawHZ3ejJQJ9fitYHNvmw/pGR39XBoB9w6EUpV8Doi4wPL7Vx2rnFGrqvTDs57/JiXU9MzeeibBYxduIWrE2vzfO8ziCth5/vDgS+tgAT4CFimqq/nemk00N993B/4Idf0viISLyL1gUbA7OJuP+T8/gas+gW6v+D082/CluV2LumH4Zv+TrflfT46pg+r7ftSueb9Pxi3aAsDL2rCy1e2sC//MOLLEUBH4HpgkYjMd6cNBF4CvhaRW4CNwFUAqrpERL4GluK0srhbVTN92H7oWDsNJj0DzXqdUGdYJmRZbsPfA7tvXQTXfg0Vj75zd+nmfdw67E92H0rnvX+04cLTT/IoUFNcxS4Aqvor+Z/7BMj3ridVHQwUfttgONnzl9MyotppRe4My4Q2y23Xnx86bf7PfQxOO/rWhknLtnHvV/OoUKok39zRnua17M7ecGR3AvsiPRW+vh4y0uCazyG+vNcRGeMfG2c5o3s1uhDOffSolz75bR3PjVnK6SdX5MP+idSoUMqjII2vrAD4YtzDsHkeXPMFVGvkdTTG+Mf+bfD1DVCxjjN2hTu6V2aW8tyYpQz9fT0XNqvBf/q2okycfYWEM/vvFdecoTDvM+j0MDS9xOtojPGPzHTnou+RffCPb6G009vFwSMZ3PfVPCYt385tnerzWM+mxMbY6c5wZwWgONb/CmMfhoZd4byBXkdjjH+oOt08bJwJV34EJzUHYOveVG4e+icrtu3nud7Nub5dXY8DNf5iBeBE7VwDI/7hjHva5+MCb4c3Juz88Q7MHebc7HVGH8AZs/eWoUkcOJLBR/0T6dK48EFfTPiwAnAiDu+GL68BBK4dAaUreR2RMf6xYjz8/Dg0vRTOfxL4u6VPpdJOS5+mNe3mxkhjBaCoMtPhmxth93q44Qeo0sDriIzxj62LnVHraraEy9+DmBiG/raOZ92WPh/1T6S6tfSJSFYAiiL73OjaqdDrHajX0euIjPGPfVvgq74QXwH6DSezRBmeG72Eob+v54JmNfivtfSJaPafLYqpLzrnRjs9BK2v8zoaY/zj8B74/Ern1OaNYzkQn8A/P01i0vLt3HpOfQZcZC19Ip0VgMLM/gCmvQyt/5FzbtSYsJd+2Nnz37ESrvuGv0qdxq3v/M7qlAM81+t0rm9fz+sITRBYATieJd/DuH/BaT3hkv9aNw8mMmRmwMibYeMf0Ocj/pAW3PnWr2RmKcNuass5jawP/2hhBaAgqyfBd7dDnbOd5p6x9laZCJCVBT/eByvGQc9X+eJgIk9/OYu6VcvwYf+zqF+t4AHeTeSxb7X8rJkCw691Oni7djjElfE6ImN8l5UFY/4J878gs/OjPLO1A5/OXEyXxgm80a81FUqV9DpCE2RWAPJaO805N1qlIdwwOudWeGPCWlYWjH0A5n7KoXYPcOvq8/h97QZu79yAR3s0sYu9UcoKQG7rpjs3elVpAP1HQ9mqXkdkjO+ysmDcQzBnKFta3M0Vc89h56E9DLmqJX3a1C58eROxrABkWzbGuTBWpYGz51/WLoSZCJCRBj/cBYu+YWG9m7kiqSMnV4rluzvPsj78jRUAAOYMc8Y8rdXGGfmoTBWvIzLGd2kHnW6dV09kdLXbuG95F7o1rc5rV7WiYhk732+ivQCowvRXYcpgp2fPaz6DOGsFYSLAgRQY3g/dNIdX4+7mf5s68kiPxtzRuSExdr7fuKK3AKQdgh/uhiXfQYtr4LK3oESc11EZ47stC9Cv+pFxYAf3pd3PwvhOfHVbS85uYNe0zNGiswDs+QtGXAdbFkK3QdDxfrvJy0SGxd+SNeoudmWVo//hpzi1ZUfG9WpOxdJ2ysccK/oKwJJRzo0wWVnQbzg07uF1RMb4Lu0gmeMHEDtvGPP0NB6Sh3ngmnPo1aqW15GZEBY9BSB1r9Pf+bzPnIu9V35oXTqbyJA8h8Nf30r8vnW8k3EZy5vew9eXtaR6eevC2Rxf5BcAVVj8Lfw8EA6mOKMdnTcQYu2Q2IS51L3sGfMUFRYPY49W5oW4QfS+ph93Na3hdWQmTER2AVj/K0weDBt/h5qtnFG8Tm7tdVTG+Cb9MFsnv0vZ2W9QPmMPX9Gdw50G8uq5zSlV0oYoNUUX9AIgIj2A/wKxwIeq+pJfN5CRBivGwp8fwfoZUO4kuPg1aHOTjd9rAirQuZ26K5n1E9+j+oovOClzJzO1OUuavc7lF19M1XLx/tyUiRJBLQAiEgu8DVwAJAN/ishoVV1a7JVmZcGe9bB5PqyeCCt/hkM70Iq1yez2HKmtbiJd4kk/mE56ZhrpGVmkZ2aRlplFRqbmPE7PVDIys1/TnPkyVcnKUjKzlEwF1ezHzvQshcwsJSvXdHWnZU93XsNZT85yiuKcoXJ+O89RUJx1aO7H7rwc9fzYdUCe5dzHWZpn3XmWzyufScfMmN88+a9LC5+nCDFofjMVIYbEepUZfPkZRVq2uAKR26mH9rN51Xz2LJ9GmfWTOPXwfJqQxWxpwV9nvEC3nlfS3m7oMj4I9hFAW2C1qq4FEJHhQC/ghD4kWzeu5PDQKymnB6mg+4knDYB9lGVGVku+zbyFqdvOIGtMDIyZ7u+/IV8iECtCTIw4vwXnsftcRIiN+XueGBFEQAARQQDyPHdel5wWqkdNz/WauAH8vUzeed3HMSDEHLN89rqP+ZsK+DsLn6fwdeXf6jaf5Yq0vfzW9PfEk4Iznq1fcvuPL5+n1qovKKsHqKj7aSBONVsrdZherR8VO95MYss2tLWbuYwfBLsA1AL+yvU8GTg770wicjtwO8App5xyzEpKlirHltJ12VqiPEdiy7OzdF1Syp5GSrnGlChRkmaxMbSMjaFErBAXG0PJWKFkiRhKxsRQsoRQMjbG/cn9+Ojnce7yse6Xdc4Xufslnnt6jOT/pWeiSqG5XVheA5SoWIPt5ZqQEVeBzDIJxNVsTrXG7ajfoDENLMeMnwW7AOSXwccc16vq+8D7AImJice8XrX6yVT91xj/R2dM8RWa24XlNUDixbfBxbf5Pzpj8hET5O0lA3VyPa8NbA5yDMYEguW2CTvBLgB/Ao1EpL6IxAF9gdFBjsGYQLDcNmEnqKeAVDVDRO4BfsZpKvexqi4JZgzGBILltglHQb8PQFXHAeOCvV1jAs1y24SbYJ8CMsYYEyKsABhjTJSyAmCMMVHKCoAxxkQpKWr/Kl4RkRRgQwEvVwN2BDGcgoRKHBA6sYRKHHD8WOqqakIwg4GwyWsInVhCJQ4Ij1gaATNV9bgjXoV8ATgeEUlS1USL42+hEkuoxAGhFUtRhFK8oRJLqMQBkRWLnQIyxpgoZQXAGGOiVLgXgPe9DsAVKnFA6MQSKnFAaMVSFKEUb6jEEipxQATFEtbXAIwxxhRfuB8BGGOMKSYrAMYYE6XCsgCISA8RWSEiq0XksSBvu46ITBGRZSKyRET+6U4fJCKbRGS++3NREGJZLyKL3O0ludOqiMgEEVnl/q4chDga5/q754vIPhG5P1jviYh8LCLbRWRxrmkFvg8iMsDNnRUi0j0QMRWXV7kdSnntbjfqczsoea2qYfWD09XuGqABEAcsAJoFcfs1gTPdx+WBlUAzYBDwcJDfi/VAtTzTXgEecx8/Brzswf9nK1A3WO8J0Bk4E1hc2Pvg/q8WAPFAfTeXYoP5HhXy3nmS26GU124MUZ/bwcjrcDwCyBl8W1XTgOzBt4NCVbeo6lz38X5gGc54sKGiFzDMfTwM6B3k7XcF1qhqQXe5+p2qTgd25Zlc0PvQCxiuqkdUdR2wGienQoFnuR0GeQ1RltvByOtwLAD5Db7tSaKKSD2gNTDLnXSPiCx0D90CfniKM+bsLyIyxx1wHKCGqm4B50MNVA9CHLn1Bb7K9TzY70m2gt6HkMmffIREbCGQ12C5XRC/5nU4FoAiDSwf8CBEygHfAver6j7gXaAh0ArYArwWhDA6quqZQE/gbhHpHIRtFsgdCvEy4Bt3khfvSWFCIn8K4HlsIZLXYLl9ooqVO+FYADwffFtESuJ8SL5Q1e8AVHWbqmaqahbwAUE4raCqm93f24Hv3W1uE5Gabpw1ge2BjiOXnsBcVd3mxhX09ySXgt4Hz/PnODyNLVTy2t2u5Xb+/JrX4VgAPB18W0QE+AhYpqqv55peM9dslwOL8y7r5zjKikj57MfAhe42RwP93dn6Az8EMo48+pHrEDnY70keBb0Po4G+IhIvIvVxek2cHcS4jsez3A6VvHa3abldMP/mdTCvovvx6vhFOK0U1gCPB3nb5+AcWi0E5rs/FwGfAYvc6aOBmgGOowHOVf8FwJLs9wGoCkwCVrm/qwTpfSkD7AQq5poWlPcE54O5BUjH2RO65XjvA/C4mzsrgJ7BzJ8i/C2e5Hao5LUbi+W2BievrSsIY4yJUuF4CsgYY4wfWAEwxpgoZQXAGGOilBUAY4yJUlYAjDEmSlkBMMaYKGUFwBhjotT/A6R8GhSeHlC3AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "parameters = {\"kb\":100, \"ku\":10,\"kdeg\":.5, \"ktx\":.5, \"ktl\":1.5, \"kdil\":.05}\n", "\n", "recBCD = Species(\"recBCD\")\n", "gamS = Species(\"GamS\")\n", "\n", "linear_dna_degredation = Deg_Tagged_Degredation(degredase = recBCD, \n", " filter_dict = {\"dna\":True, \"circular\":False}, \n", " default_on = False)\n", "\n", "inhibited_recBCD = ChemicalComplex([recBCD]+2*[gamS])\n", "\n", "Assembly_linear = DNAassembly(\"GFP\", promoter = \"strong\", rbs = \"weak\", initial_conc = 1.0)\n", "Assembly_circular = DNAassembly(\"RFP\", promoter = \"strong\", rbs = \"weak\", initial_conc = 1.0, attributes = [\"circular\"])\n", "\n", "M = SimpleTxTlExtract(\"Mixture 1\", \n", " components = [inhibited_recBCD, Assembly_linear, Assembly_circular],\n", " global_mechanisms = [linear_dna_degredation], parameters = parameters)\n", "\n", "CRN = M.compile_crn()\n", "print(CRN.pretty_print())\n", "\n", "try:\n", " %matplotlib inline\n", " print(\"Simulating with BioSCRAPE\")\n", " import numpy as np\n", " import pylab as plt\n", " timepoints = np.arange(0, 100, .1)\n", " \n", " #Simulate with no gamS\n", " x0 = {str(recBCD):1, str(gamS):0, str(Assembly_linear.dna):1.0, str(Assembly_circular.dna):1.0}\n", " R = CRN.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0)\n", " \n", " #Simulate with GamS\n", " x0 = {str(recBCD):1, str(gamS):20, str(Assembly_linear.dna):1.0, str(Assembly_circular.dna):1.0}\n", " R2 = CRN.simulate_with_bioscrape_via_sbml(timepoints, initial_condition_dict = x0)\n", " \n", " if R is not None and R2 is not None:\n", " plt.subplot(121)\n", " plt.title(\"No GamS\")\n", " plt.plot(timepoints, R[str(Assembly_linear.protein)], label = \"GFP (linear)\")\n", " plt.plot(timepoints, R[str(Assembly_circular.protein)], label = \"RFP (circular)\")\n", " plt.legend()\n", "\n", " plt.subplot(122)\n", " plt.title(\"With GamS\")\n", " plt.plot(timepoints, R2[str(Assembly_linear.protein)], label = \"GFP (linear)\")\n", " plt.plot(timepoints, R2[str(Assembly_circular.protein)], label = \"RFP (circular)\")\n", " plt.legend()\n", "\n", " plt.show()\n", "\n", "except ModuleNotFoundError:\n", " print('please install the plotting libraries: pip install biocrnpyler[all]')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 4 }